#随机森林
from matplotlib import pyplot as plt
from sklearn.model_selection import cross_val_score
from sklearn.datasets import make_blobs               #为聚类产生数据集
from sklearn.ensemble import RandomForestClassifier   #随机森林分类
from sklearn.ensemble import ExtraTreesClassifier     #极度随机森林分类
from sklearn.tree import DecisionTreeClassifier

X, y = make_blobs(n_samples=1000, n_features=6, centers=50, random_state=0)
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.show()                         #不同颜色表示不同样本


dtc = DecisionTreeClassifier(max_depth=None, min_samples_split=2, random_state=0)
result = cross_val_score(dtc, X, y)
print("决策树结果： ",result.mean())

rfc = RandomForestClassifier(n_estimators=100, min_samples_split=2, random_state=42)
result = cross_val_score(rfc, X, y)
print("随机森林结果： ",result.mean())

etc = ExtraTreesClassifier(n_estimators=100, min_samples_split=2,random_state=42)
result = cross_val_score(etc, X, y)
print("极度随机森林结果： ", result.mean())


'''
ExtRa Trees是Extremely Randomized Trees的缩写，意思就是极度随机树。
这是一种组合方法，与其说像决策树，实际上它更像随机森林。

与随机森林的相同点：
1. bootstrap了样本。
2. 随机选取了部分特征，来构造一个棵树。 我们知道随机森林是由很多个随机的决策树组成的，
extra trees比随机森林更随机。 

与随机森林的不同点：
每棵决策树选择划分点的方式不同。对于普通决策树，每个特征都是根据某个标准
(信息增益或者gini不纯)去进行划分，比如说一个数值特征的取值范围是0到100，
当我们把这个特征划分为0-45，45-100的时候，效果最佳（从信息增益或者gini不纯的角度），
决策树就会将45作为划分点；然后再按照某个标准来选择特征。而对于extra trees中的决策树，划分点的选择更为随机，
比如一个数值特征的取值范围是0到100，我们随机选择一个0到100的数值作为划分点；然后再按照评判标准选择一个特征。
'''